Unsubscribe & MTSafe

수신 등록을 해제하는 방법은 관찰자 목록에서 해당 관찰자를 제거하는 것이다.
이와 같은 방법은 스레드가 하나인 경우 아래와 같은 단순한 구현으로 충분하다.
void unsubscribe(Observer<T>* observer){
observers.erase(
remove(observers.begin(), observers.end(), observer), observers.end());
}
std::vector는 스레드 안정성이 없다.
subscribe와 unsubscribe가 동시에 호출될 경우, 의도치 않은 결과가 발새할 수 있다.
(하나의 vector에 대해 동시에 수정을 할려고 접근하게 되면, 오류가 발생할 수 있음)
스레드 안정성(MTSafe)를 보장하기 위해서 락(lock)을 이용한다.
template <typename T>
struct Observable{
void notify(T& source, const string& name){
scoped_lock<mutex> lock{mtx};
// ...
}
void subscribe(Observer<T>* f){
scoped_lock<mutex> lock{mtx};
// ...
}
void unsubscribe(Observer<T>* o){
scoped_lock<mutex> lock{mtx};
// ...
}
private:
vector<Observer<T>*> observers;
mutex mtx;
};
혹은 TPL/ PPL과 같은 병렬 작업 라이브러리를 채용하여 std::vector 대신, 스레드 안정성을 보증하는
concurrent_vector를 사용한다.
(단, concurrent_vector는 항목의 순서가 보증되지는 않음)